# -*- coding：utf-8 -*-
"""
@Time:2024-08-147:33
@Auth:泛彼泊舟
@File:2、可变与不可变数据类型.py
@IDE:PyCharm
@模块功能：xxx
"""
"""
可变的数据类型
- 列表
- 字典
- 集合
不可变的数据类型
- 整数
- 浮点数
- 布尔
- 字符串
- 元组
可变的数据类型和不可变的数据类型原理：
- 当被定义的数据值发生改变的时候，内存地址值不变，那么该数据类型就是可变的数据类型
- 当被定义的数据值发生改变的时候，内存地址值也变，那么该数据类型就是不可变的数据类型
换句话描述，就是你修改了值，不是原来的对象就是不可变的
"""
# 不可变的数据类型
str1 = "abc"
# 使用id()内建函数可以查看变量的内存地址值
print(id(str1))  # 2431535751024
print(str1)
# # 修改变量的实际值
str1 = str1.replace("b", "i")
print(id(str1))  # 2431535774064
print(str1)
# 当实际的数据被修改时，内存地址值也发生变化，那么就是不可变的数据类型
# 可变数据类型
list1 = [1, 2, 3]
print(list1)
print(id(list1))  # 2431535803648
print("--" * 100)
list1.append(6)
print(list1)
print(id(list1))  # 2431535803648

'''
总结：
- 判断一种数据类型是否可变与不可变是当变量值发生变化时，内存地址值变化或者不变化来确定可变与不可变
的类型
注意点：字典的键只能使用不可变的数据类型，值没有要求，任何数据类型都可以
'''
dict1 = {1: 0, "1": 2, (1, 2): 12}
print(dict1)  # {1: 0, '1': 2, (1, 2): 12}  输出正常
dict1 = {1: 0, "1": 2, (1, 2): 12, [5, 6]: 999}
print(dict1)  # TypeError: unhashable type: 'list'，报错

"""
字典的键为什么只能用不可变的数据类型呢
- 因为字典需要能够快速的根据键来查找、修改和删除对应值，所以具备以下特性：
    - 哈希性
    - 唯一性
    - 一致性
    - 性能
"""
dict1 = {1: 0, "1": 2, (1, 2): 12, 1: 8}
# 当字典中有相同的键，那么这个键的值是最后定义的键值对，保证字典键是唯一的
# {1: 8, '1': 2, (1, 2): 12}
print(dict1)
